(defun espaco (carac)
"Verifica se um Caracter eh #\Space"
  (char= carac #\ )
)

(defun palavras (str)
"Devolve uma lista com as palavras de uma string"
  (let ((n0 (position-if-not #'espaco str)))
;(format t "~A  NO = ~A  " str n0)
    (if (null n0)
      nil
      (let ((n1 (position-if #'espaco str :start n0)))
;(format t "N1 = ~A~%" n1)
	(if (null n1)
	  (list (subseq str n0 n1))
	  (cons (subseq str n0 n1) (palavras (subseq str n1)))
	)
      )
    )
  )
)

(defun lista-divida (file)
  (with-open-file (stream file)
    (do* ((lista (list (read stream nil)) (cons divida lista))
	  (divida (read stream nil) (read stream nil))
	  )
	  ((null divida) lista)
;; 	 (format t "Lista = ~A ~%" lista)
    )
  )
)

(defun lista-saldo (dividas)
  (if (null dividas)
    nil
    (let* ((atual (car dividas))
	  (valor (caddr atual)))
;;       (format t "Valor = ~A   Deve = ~A   Rece = ~A~%" valor (car atual) (cadr atual))
      (cons (list (car atual) (* -1 valor)) (cons (list (cadr atual) valor) (lista-saldo (cdr dividas))))
    )
  )
)

(defun ajusta-saldo(lista ajuste)
;;   (format t "Ajuste- ~A~%" ajuste)
  (if (null ajuste)
    lista
  (if (null lista)
    (list ajuste)
    (let ((nomel (car (car lista)))
	  (valorl (cadr (car lista)))
	  (nomea (car ajuste))
	  (valora (cadr ajuste)))
;;       (format t "nomel=~A nomea=~A valorl=~A valora=~A ~%" nomel nomea valorl valora)
      (if (string= nomel nomea)
	(cons (list nomea (+ valorl valora)) (cdr lista))
	(cons (car lista) (ajusta-saldo (cdr lista) ajuste))
      )
    )
  )
  )
)

(defun unifica-saldo (saldos)
  (do* ((resto saldos (cdr resto))
    (atual (car resto) (car resto))
    (unificado (ajusta-saldo nil atual) (ajusta-saldo unificado atual)))
    ((null resto) unificado)
;;   (format t "Atual = ~A   Unificado = ~A   Resto=~A~%" atual unificado resto)
  )
)

(defun divida (file)
(car (car (sort (unifica-saldo (lista-saldo (lista-divida file))) #'(lambda (x y) (< (cadr x) (cadr y))))))
)